package com.xuecheng.service.Impl;


import com.xuecheng.POJO.Cache;
import com.xuecheng.service.CacheService;
import com.xuecheng.service.VideoScraperService;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.io.IOException;
import java.time.Duration;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

@Service
public class VideoScraperServiceImpl implements VideoScraperService {

    @Autowired
    private CacheService cacheService;  // MyBatis-Plus 服务

    private final String BASE_URL = "https://www.yinghuadm.cn";
    private final String CHROME_DRIVER_PATH = "C:\\Users\\Lenovo\\Downloads\\chromedriver_win32\\chromedriver.exe";
    private final String CHROME_BINARY_PATH = "C:\\Users\\Lenovo\\Downloads\\chrome-win\\chrome.exe";

    @Scheduled(fixedRate = 60000)  // 每60秒执行一次
    @Override
    public void fetchVideoData() {
        // 设置 ChromeDriver 路径
        System.setProperty("webdriver.chrome.driver", CHROME_DRIVER_PATH);

        // 配置 ChromeOptions
        ChromeOptions options = new ChromeOptions();
        options.setBinary(CHROME_BINARY_PATH);  // 设置 Chrome 浏览器路径
        options.addArguments("--headless");  // 无头模式
        options.addArguments("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36");
        options.addArguments("--disable-gpu");  // 禁用 GPU 加速
        options.addArguments("--no-sandbox");  // 禁用沙箱
        options.addArguments("--disable-dev-shm-usage");  // 禁用共享内存使用

        // 创建 WebDriver 实例
        WebDriver driver = new ChromeDriver(options);

        // 示例：获取首页或视频详情页URL
        String videoPageUrl = BASE_URL + "/vod_9098.html";

        // 使用 WebDriver 获取页面内容
        driver.get(videoPageUrl);

        // 获取页面的 HTML 内容
        String pageContent = driver.getPageSource();
//        System.out.println("--------------    pageContent    ------------------");
//        System.out.println(pageContent);


        // 解析页面内容并提取视频链接
        List<String> videoUrls = parseVideoUrls(pageContent);
//        System.out.println("--------------    test    ------------------");
//        System.out.println(videoUrls);

        // 保存到数据库，避免重复插入
        for (String videoUrl : videoUrls) {
            if (!cacheService.checkAndSave(videoUrl)) {
                Cache cache = buildCacheFromUrl(videoUrl);
                cacheService.save(cache);  // 插入数据库
                System.out.println("视频 " + videoUrl + " 已插入数据库。");
            } else {
                System.out.println("视频 " + videoUrl + " 已经存在，跳过插入。");
            }
        }

        // 休眠5秒，避免过于频繁地请求
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // 关闭 WebDriver
        driver.quit();
    }

//    根据Url获取视频地址
//    @Override
//    public String getVideo(String url) throws IOException, InterruptedException {
//        ChromeDriver chromeDriver = initDriver();  // 初始化ChromeDriver
//        chromeDriver.get(url); // 使用 WebDriver 获取页面内容
//        String pageContent = chromeDriver.getPageSource();  // 获取页面的 HTML 内容
//
//        String videoUrl = null;
//        // 正则表达式匹配 iframe 标签的 src 属性
//        String regex = "<iframe[^>]+src=\"(https://danmu\\.yhdmjx\\.com[^\\\"]+)\"";  // 修改正则表达式，确保只匹配 URL
//        Pattern pattern = Pattern.compile(regex);
//        Matcher matcher = pattern.matcher(pageContent);
//
//        Document doc = Jsoup.parse(pageContent);
//        String videoName = doc.select("div.module-info-heading h1 a").first().text();
//        String videoLevel = doc.select("div.tips-list.fodong_tips ul li").first().text();  // 选择第一个 <li> 标签
//
//
//        if (matcher.find()) {
//            videoUrl = matcher.group(1); // 获取第一个匹配的 src 属性值
//            System.out.println("视频链接：" + videoUrl);  // 打印纯粹的视频链接
////            保存到数据库
//            Cache cache = new Cache();
//            cache.setVideosUrl(videoUrl);
//            cache.setStatus("PENDING");
//            cache.setDownloadedSize(10);
//            cache.setWebSite("https://www.yinghuadm.cn");
//            cache.setVideosName(videoName);
//            cache.setLabelUrl(videoLevel);
//
//            boolean save = cacheService.save(cache);
//            if(!save){
//                System.out.println("保存失败");
//            }
//            cacheService.downloadAndSplitVideo(videoUrl, "D:\\video\\", videoName, 10);
//            System.out.println("下载成功");
//        }
//
//        return "";
//    }
@Override
public String getVideo(String url) throws IOException, InterruptedException {
    ChromeDriver chromeDriver = initDriver();  // 初始化ChromeDriver
    chromeDriver.get(url); // 使用 WebDriver 获取页面内容
    WebDriverWait wait = new WebDriverWait(chromeDriver, Duration.ofSeconds(30)); // 显式等待，最多等待30秒

    // 等待iframe加载完成
    WebElement iframe = wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("iframe[src^='https://danmu.yhdmjx.com']")));
    WebElement videoNameElement = wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("div.module-info-heading h1 a")));
    WebElement videoLevelElement = wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("div.tips-list.fodong_tips ul li")));

// 获取视频名称
    String videoName = videoNameElement.getText();
    String videoLevel = videoLevelElement.getText();

    chromeDriver.switchTo().frame(iframe);  // 切换到iframe

    // 获取 iframe 页面源代码
    String iframePageSource = chromeDriver.getPageSource();

    // 使用 Jsoup 解析 iframe 页面内容
    Document iframeDoc = Jsoup.parse(iframePageSource);

    // 找到视频 URL，可能需要根据实际 HTML 结构调整选择器
    String videoUrl = iframeDoc.select("video#lelevideo").attr("src");

    if (videoUrl != null && !videoUrl.isEmpty()) {
        System.out.println("视频链接：" + videoUrl);  // 打印直接视频链接


//        String videoName = null;
//        String videoLevel =null;
//        // 保存到数据库
//        Element videoNameElement = iframeDoc.select("div.module-info-heading h1 a").first();
//        if (videoNameElement != null) {
//            videoName = videoNameElement.text();
//        } else {
//            System.out.println("未找到视频名称！");
//        }
//        Element videoLevelElement = iframeDoc.select("div.tips-list.fodong_tips ul li").first();
//        if (videoLevelElement != null) {
//            videoLevel = videoLevelElement.text();
//        } else {
//            System.out.println("未找到视频状态！");
//        }




        Cache cache = new Cache();
        cache.setVideosUrl(videoUrl);
        cache.setStatus("PENDING");
        cache.setDownloadedSize(10);
        cache.setWebSite("https://www.yinghuadm.cn");
        cache.setVideosName(videoName);
        cache.setLabelUrl(videoLevel);

        boolean save = cacheService.save(cache);
        if(!save){
            System.out.println("保存失败");
        }
        cacheService.downloadAndSplitVideo(videoUrl, "D:\\video\\", videoName, 10);
        System.out.println("下载成功");
    }

    chromeDriver.quit();  // 关闭浏览器
    return "";
}


//    驱动初始化
    private ChromeDriver initDriver(){
        final String BASE_URL = "https://www.yinghuadm.cn";
        final String CHROME_DRIVER_PATH = "C:\\Users\\Lenovo\\Downloads\\chromedriver_win32\\chromedriver.exe";
        final String CHROME_BINARY_PATH = "C:\\Users\\Lenovo\\Downloads\\chrome-win\\chrome.exe";

        // 设置 ChromeDriver 路径
        System.setProperty("webdriver.chrome.driver", CHROME_DRIVER_PATH);

        // 配置 ChromeOptions
        ChromeOptions options = new ChromeOptions();
        options.setBinary(CHROME_BINARY_PATH);  // 设置 Chrome 浏览器路径
        options.addArguments("--headless");  // 无头模式
        options.addArguments("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36");
        options.addArguments("--disable-gpu");  // 禁用 GPU 加速
        options.addArguments("--no-sandbox");  // 禁用沙箱
        options.addArguments("--incognito"); // 使用隐身模式，这样每次都不使用缓存
        options.addArguments("--disable-cache"); // 禁用缓存
        options.addArguments("--disable-dev-shm-usage");  // 禁用共享内存使用

        // 创建 WebDriver 实例
        return new ChromeDriver(options);
    }


    // 解析页面内容并提取视频链接
    public List<String> parseVideoUrls(String pageContent) {
        List<String> videoUrls = new ArrayList<>();

        // 使用 Jsoup 解析 HTML
        Document doc = Jsoup.parse(pageContent);

        // 使用正则表达式匹配 <video> 标签中的 src 属性
        String videoPattern = "<video[^>]*src=['\"](http[^'\"]+)['\"][^>]*>";
        Pattern pattern = Pattern.compile(videoPattern);
        Matcher matcher = pattern.matcher(pageContent);

        while (matcher.find()) {
            // 获取视频的 URL
            String videoUrl = matcher.group(1);
            videoUrls.add(videoUrl);
        }

        return videoUrls;
    }


    // 根据视频URL构建Cache对象
    private Cache buildCacheFromUrl(String videoUrl) {
        Cache cache = new Cache();
        cache.setVideosUrl(videoUrl);
        cache.setStatus("未下载");  // 初始状态
        cache.setDownloadedSize(0);  // 初始已下载大小
        cache.setTotalSize(0);       // 初始总大小
        cache.setCreatedAt(String.valueOf(System.currentTimeMillis()));  // 设置创建时间戳
        cache.setWebSite(BASE_URL);  // 填写网站地址
        cache.setLabelUrl("");       // 标签链接（可以根据需要填充）
        cache.setVideosName("未知视频");  // 可以根据页面解析提取视频名称
        return cache;
    }
}
